package com.gomoku.common.util;


import com.gomoku.common.result.Result;

/**
 * 响应工具类
 * 提供便捷的响应创建方法
 * 
 * @author gomoku
 * @version 1.0.0
 * @since 2024-01-01
 */
public class ResponseUtil {

    /**
     * 私有构造方法，防止实例化
     */
    private ResponseUtil() {
        throw new UnsupportedOperationException("ResponseUtil class cannot be instantiated");
    }

    // ==================== 成功响应 ====================

    /**
     * 成功响应（无数据）
     * 
     * @return Result对象
     */
    public static <T> Result<T> success() {
        return Result.success();
    }

    /**
     * 成功响应（带数据）
     * 
     * @param data 返回数据
     * @return Result对象
     */
    public static <T> Result<T> success(T data) {
        return Result.success(data);
    }

    /**
     * 成功响应（自定义消息）
     * 
     * @param message 自定义消息
     * @param data 返回数据
     * @return Result对象
     */
    public static <T> Result<T> success(String message, T data) {
        return Result.success(message, data);
    }

    // ==================== 用户管理响应 ====================

    /**
     * 用户注册成功响应
     * 
     * @param data 用户数据
     * @return Result对象
     */
    public static <T> Result<T> userRegisterSuccess(T data) {
        return Result.success("用户注册成功", data);
    }

    /**
     * 用户信息更新成功响应
     * 
     * @param data 用户数据
     * @return Result对象
     */
    public static <T> Result<T> userUpdateSuccess(T data) {
        return Result.success("用户信息更新成功", data);
    }

    /**
     * 用户信息查询成功响应
     * 
     * @param data 用户数据
     * @return Result对象
     */
    public static <T> Result<T> userQuerySuccess(T data) {
        return Result.success("用户信息查询成功", data);
    }

    // ==================== 认证授权响应 ====================

    /**
     * 登录成功响应
     * 
     * @param data 登录数据
     * @return Result对象
     */
    public static <T> Result<T> loginSuccess(T data) {
        return Result.success("登录成功", data);
    }

    /**
     * 登出成功响应
     * 
     * @return Result对象
     */
    public static <T> Result<T> logoutSuccess() {
        return Result.success("登出成功", null);
    }

    /**
     * Token刷新成功响应
     * 
     * @param data Token数据
     * @return Result对象
     */
    public static <T> Result<T> tokenRefreshSuccess(T data) {
        return Result.success("Token刷新成功", data);
    }

    // ==================== 积分管理响应 ====================

    /**
     * 积分更新成功响应
     * 
     * @param data 积分数据
     * @return Result对象
     */
    public static <T> Result<T> scoreUpdateSuccess(T data) {
        return Result.success("积分更新成功", data);
    }

    /**
     * 积分流水查询成功响应
     * 
     * @param data 积分流水数据
     * @return Result对象
     */
    public static <T> Result<T> scoreRecordQuerySuccess(T data) {
        return Result.success("积分流水查询成功", data);
    }

    // ==================== 匹配系统响应 ====================

    /**
     * 加入匹配队列成功响应
     * 
     * @return Result对象
     */
    public static <T> Result<T> joinMatchQueueSuccess() {
        return Result.success("已加入匹配队列", null);
    }

    /**
     * 退出匹配队列成功响应
     * 
     * @return Result对象
     */
    public static <T> Result<T> exitMatchQueueSuccess() {
        return Result.success("已退出匹配队列", null);
    }

    /**
     * 匹配成功响应
     * 
     * @param data 匹配结果数据
     * @return Result对象
     */
    public static <T> Result<T> matchSuccess(T data) {
        return Result.success("匹配成功", data);
    }

    /**
     * 取消匹配成功响应
     * 
     * @return Result对象
     */
    public static <T> Result<T> cancelMatchSuccess() {
        return Result.success("取消匹配成功", null);
    }

    // ==================== 游戏核心响应 ====================

    /**
     * 游戏房间创建成功响应
     * 
     * @param data 房间数据
     * @return Result对象
     */
    public static <T> Result<T> roomCreateSuccess(T data) {
        return Result.success("游戏房间创建成功", data);
    }

    /**
     * 加入游戏房间成功响应
     * 
     * @param data 房间数据
     * @return Result对象
     */
    public static <T> Result<T> joinRoomSuccess(T data) {
        return Result.success("加入游戏房间成功", data);
    }

    /**
     * 退出游戏房间成功响应
     * 
     * @return Result对象
     */
    public static <T> Result<T> exitRoomSuccess() {
        return Result.success("退出游戏房间成功", null);
    }

    /**
     * 落子成功响应
     * 
     * @param data 落子数据
     * @return Result对象
     */
    public static <T> Result<T> moveSuccess(T data) {
        return Result.success("落子成功", data);
    }

    /**
     * 认输成功响应
     * 
     * @return Result对象
     */
    public static <T> Result<T> surrenderSuccess() {
        return Result.success("认输成功", null);
    }

    /**
     * 游戏结束响应
     * 
     * @param data 游戏结果数据
     * @return Result对象
     */
    public static <T> Result<T> gameEndSuccess(T data) {
        return Result.success("游戏结束", data);
    }

    // ==================== 实时通信响应 ====================

    /**
     * WebSocket连接成功响应
     * 
     * @param data 连接数据
     * @return Result对象
     */
    public static <T> Result<T> websocketConnectSuccess(T data) {
        return Result.success("WebSocket连接成功", data);
    }

    /**
     * 消息发送成功响应
     * 
     * @return Result对象
     */
    public static <T> Result<T> messageSendSuccess() {
        return Result.success("消息发送成功", null);
    }

    // ==================== 错误响应 ====================

    /**
     * 参数错误响应
     * 
     * @param message 错误信息
     * @return Result对象
     */
    public static <T> Result<T> paramError(String message) {
        return Result.paramError(message);
    }

    /**
     * 系统错误响应
     * 
     * @param message 错误信息
     * @return Result对象
     */
    public static <T> Result<T> systemError(String message) {
        return Result.systemError(message);
    }

    /**
     * 自定义错误响应
     * 
     * @param code 错误码
     * @param message 错误信息
     * @return Result对象
     */
    public static <T> Result<T> error(String code, String message) {
        return Result.error(code, message);
    }

    /**
     * 自定义错误响应（带数据）
     * 
     * @param code 错误码
     * @param message 错误信息
     * @param data 错误数据
     * @return Result对象
     */
    public static <T> Result<T> error(String code, String message, T data) {
        return Result.error(code, message, data);
    }
}
